package top.v5it.logback.push.convergence;

import cn.hutool.core.lang.Assert;
import lombok.extern.slf4j.Slf4j;
import org.springframework.remoting.RemoteAccessException;
import top.v5it.logback.push.Message;
import top.v5it.logback.push.client.ErrorOutput;
import top.v5it.logback.push.client.ErrorOutputs;

/**
 * 示例说明，基于注解方式需要在启动类上添加@EnableErrorOutput，否则注解方式处理无效
 *
 * @author zhanpu
 * @date 2022/9/21
 */
@Slf4j
public class Example {

    /**
     * 原生方式，自己手动捕获异常处理
     */
    public void example_native() {
        try {
            final Class<?> clazz = Class.forName("top.v5it.logback.push.convergence.Example");
        } catch (ClassNotFoundException e) {
            final Message message = new Message()
                    .setId("notfound_zzz") // 设置消息编号
                    .setTitle("找不到类") // 设置消息标题
                    .setDescription("找不到[top.v5it.logback.push.convergence.Example]类");
            log.error("{}", message);
        }
    }

    /**
     * 基于{@link ErrorOutput}注解方式，适用于用单业务方法
     */
    @ErrorOutput(id = "xxxx_1", title = "示例测试")
    public void example_annotation() {
        boolean biz = false;
        Assert.isTrue(biz, "调用业务xx方法失败，可能yy原因");
    }

    /**
     * 基于{@link ErrorOutputs}注解方式，适用在一个方法中包含诸多业务逻辑，并且明确申明所属业务异常
     */
    @ErrorOutputs({@ErrorOutput(id = "1234", errorFor = IllegalArgumentException.class), @ErrorOutput(id = "876", errorFor = RemoteAccessException.class)})
    public void example_annotation_more() {
        boolean biz = false;
        Assert.isTrue(biz, "调用业务xx方法失败，可能yy原因");
        boolean call_remote = false;
        Assert.isTrue(call_remote, () -> new RemoteAccessException("网络超时，调用远程接口失败"));
    }
}
